{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import re\n",
    "import csv\n",
    "import requests\n",
    "import time\n",
    "from bs4 import BeautifulSoup\n",
    "from urllib.parse import unquote\n",
    "from lxml import etree\n",
    "import random\n",
    "from time import sleep\n",
    "from multiprocessing.dummy import Pool as TreadPool\n",
    "import datetime\n",
    "from tqdm import tqdm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getHTMLResponse(url):\n",
    "    headers = {\n",
    "        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',\n",
    "        'cookie': '_T_WM=7cd2fe00a46ec406f450f4ad4764df2b; SUB=_2A25yHhL1DeRhGeNL6FUZ8inIyD-IHXVR4L69rDV6PUNbktANLWXBkW1NSRtw-UgxtiIVZEtYWqy18AK3UycSktDK; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WW9ciTfJHi3v88u56ZUFhyf5JpX5KzhUgL.Fo-fe0MReoMXe0e2dJLoIpzLxKqL1h2LB.2LxKqLBK2L1K2t; SUHB=0sqBYxW86J6g_p; SSOLoginState=1595564709; ALF=1598156709',\n",
    "    }\n",
    "    try:\n",
    "        r = requests.get(url,headers)\n",
    "        r.raise_for_status()\n",
    "        r.encoding = r.apparent_encoding\n",
    "        return r\n",
    "    except:\n",
    "        print(\"获取html失败\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getPageURLs(url):\n",
    "    urls = []\n",
    "    r = requests.get(url)   \n",
    "    tree_node = etree.HTML(r.content)\n",
    "    is_exist_pages = tree_node.xpath(r'//*[@id=\"post_head\"]/div[3]/div[3]')\n",
    "    if is_exist_pages:\n",
    "        for item in tree_node.xpath(r'//div[@class=\"mb15 cf\"]/div[@class=\"atl-pages\"]//a'):\n",
    "            if item.text.isdigit():\n",
    "                total_page = int(item.text)\n",
    "        print(\"总页数：\",total_page)\n",
    "    \n",
    "        for page in range(1,total_page+1):\n",
    "            new_url = re.sub(r'-\\d+.shtml','-%d.shtml' % page,url,re.S)\n",
    "            urls.append(new_url)\n",
    "\n",
    "    # 无多页只返回原url\n",
    "    else:\n",
    "        urls.append(url)\n",
    "    return urls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getDate(r,csv_file):\n",
    "    html_doc = r.content\n",
    "    soup = BeautifulSoup(html_doc, \"html.parser\")\n",
    "    tree_node = etree.HTML(html_doc)\n",
    "    for item in soup.find_all(\"div\", class_=\"atl-item\"):\n",
    "        author = unquote(item.attrs[\"_host\"])\n",
    "        print(author)\n",
    "        \n",
    "        time = item.attrs.get(\"js_restime\")\n",
    "        if time is None:\n",
    "            author_time_info = tree_node.xpath('//*[@id=\"post_head\"]/div[2]/div[2]/span[2]/text()')[-1]\n",
    "            time = re.findall(r'时间：(.*)',author_time_info)[-1]\n",
    "        print(time)\n",
    "        \n",
    "        content_info = item.find(\"div\", class_=\"bbs-content\")\n",
    "        content_text = content_info.text.replace('\\t','').replace('\\n','').replace('\\u3000','')\n",
    "        print(content_text)\n",
    "\n",
    "    csv_file.writerow([author,time,content_text])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_acquire(url,filname):\n",
    "    pool = TreadPool(3)\n",
    "    contents = []\n",
    "    FILE_PATH = './log'+ os.sep + filename + '.csv'\n",
    "    headers = [\"Author\", \"Time\", \"Content\"]\n",
    "\n",
    "    time_start = time.time()\n",
    "    print(f\"开始时间：{datetime.datetime.now()}\")\n",
    "\n",
    "    urls = getPageURLs(url)\n",
    "\n",
    "    # 分布式获取source \n",
    "    for url,source in tqdm(zip(urls,pool.map(getHTMLResponse,urls)),total=len(urls),maxinterval=0.3):\n",
    "        print(url)\n",
    "        contents.append(source)\n",
    "    pool.close()\n",
    "    pool.join()\n",
    "\n",
    "    with open(file=FILE_PATH, mode=\"w\", newline=\"\", encoding=\"utf-8\") as file:\n",
    "        # 创建csv写入对象\n",
    "        csv_file = csv.writer(file)\n",
    "        # 写入头部信息\n",
    "        csv_file.writerow(headers)\n",
    "        #\n",
    "        # 写入数据\n",
    "        for content in contents:\n",
    "            getDate(content,csv_file)\n",
    "            print('---')\n",
    "\n",
    "    time_end = time.time()\n",
    "    print(f'结束时间：{datetime.datetime.now()}并行程耗时：{time_end-time_start}') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始时间：2020-08-07 00:12:51.721805\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1003.42it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://bbs.tianya.cn/post-itinfo-528697-1.shtml\n",
      "yufengzuoban\n",
      "2018-09-04 15:51:50 \n",
      "人工智能助力老师阅卷评分、大数据帮助考生选择专业、语音识别技术帮助学生纠正英语口语发音……随着人工智能在教育领域的广泛应用，教育教学模式正在悄然发生改变。重构教学场景，颠覆传统学习模式人工智能在课堂教学方面的应用，正在改变老师的教学理念和教学方式。智慧课堂是人工智能重塑教与学的一个典型应用。在合肥八中的“智慧课堂”上，教师将学习内容通过学案、微课、课件等形式提前推送给学生，学生进行自主预习，遇到不懂的问题可以借助作业平台、班级空间反馈给老师。针对学生的普遍性问题，老师进行针对性地备课和讲解，避免充分备课却不知道学生疑问在哪的情况发生，初步实现了课堂翻转，“先学后教，以学定教”。课堂互动手段多样，教学反馈直观及时，课程资源丰富多彩。每一位学生的观点都可以呈现到电子屏上，这提高了学生课堂参与度，激发学习的主动性、积极性，有助于培养学生创造性思维，满足学生多样化的需要。借助人工智能，大班教学可以有效照顾到每个学生的学习情况，让课堂教学变得更加“个性化”。“智慧课堂”的作业布置、检查、批改更为便捷，针对性更强。老师可以通过作业平台随时随地布置作业、批改作业，通过数据分析，老师可以了解学生的学习现状，个性化推送作业，布置分层作业，为学生制定不同的教学方案。学生遇到不懂的问题，可以随时通过平台向老师求助，老师可以通过平台，以音频、视频、文字等形式给学生答疑解惑，师生之间可以零距离交流，进而提高学生的学习效率。合肥八中有关负责人表示，正在积极推进智慧课堂实践活动，通过信息化来撬动课堂教学改革，变革教学模式。智慧课堂带来了巨大变化，学生的学习兴趣、学习能力和学习效率大幅提升，师生关系也得到改善。北京欧雷新宇动画科技是国内领先的VR虚拟现实、影视动漫制作整体解决方案供应商。致力于国内VR、影视、动漫、游戏等产业软硬件产品研发、生产、服务。以雄厚的技术实力为数字媒体艺术教育行业提供实训室设备、咨询、方案设计及实施服务。优化资源布局，促进教育均衡发展我国教育资源分布不均衡，城乡教育差距较大。教育部门可以利用AR(增强现实技术)、VR(虚拟现实技术)、大数据、智能语音、计算机拟真、深度学习、图像理解等人工智能或者其他先进技术，以信息化为手段，构建互联网智慧教育平台，开展智能化教学，推进教育均衡发展，缓解农村地区教师资源不足、师资力量薄弱等问题。针对乡村学校师资力量薄弱、结构性矛盾突出、农村教学点课程“开不齐，开不好”等问题，近年来安徽以全面建设农村在线课堂为突破口，推动优质教育资源城乡共享，提升农村教育质量。在线课堂常态化教学已累计开课近54万节，涉及音乐、美术、英语等8个学科，受益学生33万余人。目前，不少乡村学校正在升级“在线课堂”模式，向智慧课堂转型。乡村老师可以通过平板电脑等，充分利用城市优质教育资源，对学生进行个性化教学，让课堂变得更加生动有趣，丰富了乡村学生的学习体验，激发了他们的学习动力，提高了他们的学习能力和学习效率。智能教育不仅对学生有所帮助，也能够提高乡村老师的教学能力。乡村老师借助智能教育平台，学习先进教育理念和教学方法，得到既便捷又实用的培训。通过人工智能辅助教学，乡村老师可以从繁重、琐碎的行政事务中解脱出来，有更多精力备课教学，了解每个学生的学习状况，从而提升教学水平。教育专家指出，教育均衡最根本的还是教学质量水平的均衡，这就要求凸显软件的作用，需要进一步搭建系统的智能教育平台，让教学双方更喜欢。用人工智能促进教育公平，让信息技术和教育相结合，能够建立贯穿教育教学的三大空间，即课前的教师备课、学生预习，课中的课堂授课，课后的作业批改、数据统计分析。互动课堂、智能学习、资源推荐、管理平台、移动学习等智能教育产品为教育均衡发展提供了较大的可能性。丰富选择路径，助力教育教学改革对很多学生来说，学科、专业选择是一个非常棘手的问题。而借助人工智能，学生可以从宏观上了解学科、专业选择的利与弊。一些省市高考改革后，学生需要“6选3”选课，也就是从思想政治、历史、地理、物理、化学、生物6门科目中自主选择参加3门考试科目。学科组合怎么选？大数据分析可以告诉学生哪些学科组合竞争太激烈，容易让大学专业选择严重受限。高考填报志愿时，人工智能可以对考生进行心理评测，结合考生的兴趣、爱好、特长等，给出相匹配的专业选择参考。例如，百度教育利用AI(人工智能)技术推出高考智能估分、大学专业评测以及智能志愿填报等服务,可以根据学校往年录取记录、录取名次、学校排名、热度、招生政策、专业等，为考生提供冲刺院校、稳妥院校和保底院校三档志愿学校，在一定程度上解决了考生与大学专业之间的“信息不对称”问题。令人欣喜的是，政府和有关部门已经注意到人工智能对未来教育的深刻影响，并出台了相关发展规划和行动计划。国务院已于2017年7月印发《新一代人工智能发展规划》，提出要发展“智能教育”。利用智能技术加快推动人才培养模式、教学方法改革，构建包含智能学习、交互式学习的新型教育体系。开展智能校园建设，推动人工智能在教学、管理、资源建设等全流程应用。开发立体综合教学场、基于大数据智能的在线学习教育平台。开发智能教育助理，建立智能、快速、全面的教育分析系统。今年上半年，教育部发布《教育信息化2.0行动计划》，提出大力推进智能教育，开展以学习者为中心的智能化教学支持环境建设，推动人工智能在教学、管理等方面的全流程应用，利用智能技术加快推动人才培养模式、教学方法改革，探索泛在、灵活、智能的教育教学新环境建设与应用模式。欧雷新宇相信随着相关发展规划和行动计划的深入实施，人工智能将进一步助推教育教学改革，助力教育精准扶贫，推动教育均衡发展，拓展未来教育新空间。\n",
      "---\n",
      "结束时间：2020-08-07 00:12:52.475788并行程耗时：0.753983736038208\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "url=\"http://bbs.tianya.cn/post-itinfo-528697-1.shtml\"\n",
    "filename = '欧雷｜人工智能，助飞未来教育(转载)'\n",
    "run_acquire(url,filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
